/**
 * 通用工具函数
 */

/**
 * 格式化时间
 * time: 时间对象/时间戳/时间字符串
 * pattern: 格式化模式，默认为 '{y}-{m}-{d} {h}:{i}:{s}'
 * 返回格式化后的时间字符串
 */
export function parseTime(time, pattern = '{y}-{m}-{d} {h}:{i}:{s}') {
  if (!time) return '';
  
  let date;
  if (typeof time === 'object') {
    date = time;
  } else {
    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    }
    if (typeof time === 'number' && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  };
  
  return pattern.replace(/{([ymdhisa])+}/g, (result, key) => {
    const value = formatObj[key];
    // 注意：getDay() 返回 0 表示周日
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value];
    }
    return value.toString().padStart(2, '0');
  });
}

/**
 * 格式化文件大小
 * size: 文件大小（字节）
 * 返回格式化后的文件大小
 */
export function formatFileSize(size) {
  if (!size) return '0 B';
  
  const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  let index = 0;
  while (size >= 1024 && index < units.length - 1) {
    size /= 1024;
    index++;
  }
  
  return Math.round(size * 100) / 100 + ' ' + units[index];
}

/**
 * 深拷贝对象
 * source: 源对象
 * 返回拷贝后的新对象
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    return source;
  }
  
  const targetObj = source.constructor === Array ? [] : {};
  
  Object.keys(source).forEach(key => {
    if (source[key] && typeof source[key] === 'object') {
      targetObj[key] = deepClone(source[key]);
    } else {
      targetObj[key] = source[key];
    }
  });
  
  return targetObj;
}

/**
 * 防抖函数
 * fn: 需要防抖的函数
 * delay: 延迟时间，单位毫秒
 * 返回防抖后的函数
 */
export function debounce(fn, delay) {
  let timer;
  return function(...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
}

/**
 * 节流函数
 * fn: 需要节流的函数
 * interval: 间隔时间，单位毫秒
 * 返回节流后的函数
 */
export function throttle(fn, interval) {
  let last = 0;
  return function(...args) {
    const now = Date.now();
    if (now - last >= interval) {
      last = now;
      fn.apply(this, args);
    }
  };
}

/**
 * 生成随机字符串
 * length: 字符串长度
 * 返回随机字符串
 */
export function randomString(length = 16) {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

/**
 * 从URL中获取查询参数
 * url: URL字符串
 * 返回查询参数对象
 */
export function getQueryParams(url = window.location.href) {
  const search = url.substring(url.lastIndexOf('?') + 1);
  const obj = {};
  const reg = /([^?&=]+)=([^?&=]*)/g;
  search.replace(reg, (rs, $1, $2) => {
    const name = decodeURIComponent($1);
    let val = decodeURIComponent($2);
    val = String(val);
    obj[name] = val;
    return rs;
  });
  return obj;
}

/**
 * 将对象转换为URL查询字符串
 * params: 参数对象
 * 返回URL查询字符串
 */
export function toQueryString(params) {
  return Object.keys(params)
    .filter(key => params[key] !== undefined && params[key] !== null && params[key] !== '')
    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
    .join('&');
} 